using System;
using System.Collections.Generic;
using System.Text;
using Cancion;
using Cancion.Notas;
using Cancion.Figuras;
using Juego.Jugador;
using System.Media;
using System.Diagnostics;

namespace Juego
{
    public class Guitarra
    {
         private IList<Tecla> _teclas;
         private List<Linea> _lineas;
         private Cancion.Cancion _cancion;

		public Linea LineaParaNota(string nombreNota)
		{
			for (int i = 0; i < _lineas.Count ; i ++)
			{
				Linea linea = _lineas[i];
				if (linea.Notas.Contains(nombreNota))
					return linea;
			}
            return null;
		}

        public Guitarra(Cancion.Cancion song)
        {
            this._cancion = song;
            this._teclas = new List<Tecla>();
            this._lineas = new List<Linea>();
            this.AsignaTeclas('A','S','D','F');
            this.AsignaTeclasALineas();
            this.RepartirNotasPorLinea();
        }

        public IList<Linea> Lineas
        {
            get { return this._lineas; }
        }

        //Asigna las teclas que van a ser usadas durante el juego
        private void AsignaTeclas(char tecla1, char tecla2, char tecla3, char tecla4)
        {
             
			this._teclas.Add(new Tecla(tecla1));
			this._teclas.Add(new Tecla(tecla2));
			this._teclas.Add(new Tecla(tecla3));
			this._teclas.Add(new Tecla(tecla4));
			
        }

        //Asigna la tecla que va a asignar a cada linea de la guitarra
        private void AsignaTeclasALineas()
        {
             
             foreach (Tecla unatecla in this._teclas)
             {
                 this._lineas.Add(new Linea(unatecla, _lineas.Count));
             }
        }

        //Muestra la tecla que esta asociada a la nota dentro de las
        //lineas de la guitarra y si no la encuentra lanza una excepcion
        private int MostrarTeclaAsociadaNota(Nota unanota)
        {
            bool encontrada = false;
			int k = -1;
            IEnumerator<Linea> iterador = this._lineas.GetEnumerator();

            while(!encontrada && iterador.MoveNext())
            {
                if(iterador.Current.Notas.Contains(unanota.GetNombre ()))
				{
					k = iterador.Current.TeclaAsociada.GetTecla;
                    encontrada = true;
				}
            }
			return k;
        }

        //Muestra por pantalla una descripcion de la nota que aparece, en el momento actual,
        //en la cancion detallando la nota, el tiempo de entrada, la duracion y la tecla asociada a la nota
        public void MostrarMapaTemporal()
        {
            IEnumerator<Nota> it = this._cancion.Notas.GetEnumerator();
            double tiempo_actual = 0;
            while (it.MoveNext())
            {
                //El tiempo se mueve en base al tiempo minimo en una cancion considerado como
                //el tiempo de duracion de una semicorchea
                Semicorchea unasemicorchea = new Semicorchea(this._cancion.ObtenerTiempoDeCompas());
                double tiempo_semicorchea = unasemicorchea.devolvertiempo() ;

                while (tiempo_actual < it.Current.TiempoEntrada)
                {
                    tiempo_actual = tiempo_actual + tiempo_semicorchea;
                }

                Debug.WriteLine("Nota: " + it.Current.ToString() + " surgio en el tiempo: " + tiempo_actual +
                    " tiene una duracion de: " + it.Current.GetFigura.devolvertiempo() +
					" (" + this.MostrarTeclaAsociadaNota(it.Current) +")");
            }

        }

        /*A partir de la lista de notas existentes, las reparte entre las
         * lineas, para saber que notas van a caer por cada una.*/
        private void RepartirNotasPorLinea()
        {
            int TiposDeNotas = ( (this._cancion.GetTipoDeNotas()).Count );
            //IEnumerator<Nota> iteradorTiposDeNotas = this._cancion.GetTipoDeNotas().GetEnumerator();
            //IEnumerator<Nota> iteradorListaDeNotas = this._cancion.GetNotas().GetEnumerator();
           
            switch (TiposDeNotas)
            {
                    case 1:
						(this._lineas[0]).AsignarNota(this._cancion.GetTipoDeNotas()[0].GetNombre());
                        break;
                    case 2:
						(this._lineas[0]).AsignarNota(this._cancion.GetTipoDeNotas()[0].GetNombre());
						(this._lineas[1]).AsignarNota(this._cancion.GetTipoDeNotas()[1].GetNombre());
                        break;
                    case 3:
						(this._lineas[0]).AsignarNota(this._cancion.GetTipoDeNotas()[0].GetNombre());
						(this._lineas[1]).AsignarNota(this._cancion.GetTipoDeNotas()[1].GetNombre());
						(this._lineas[2]).AsignarNota(this._cancion.GetTipoDeNotas()[2].GetNombre());
                        break;
                    case 4:
						(this._lineas[0]).AsignarNota(this._cancion.GetTipoDeNotas()[0].GetNombre());
						(this._lineas[1]).AsignarNota(this._cancion.GetTipoDeNotas()[1].GetNombre());
						(this._lineas[2]).AsignarNota(this._cancion.GetTipoDeNotas()[2].GetNombre());
						(this._lineas[3]).AsignarNota(this._cancion.GetTipoDeNotas()[3].GetNombre());
                        break;
                    case 5:
						(this._lineas[0]).AsignarNota(this._cancion.GetTipoDeNotas()[0].GetNombre());
						(this._lineas[0]).AsignarNota(this._cancion.GetTipoDeNotas()[1].GetNombre());
						(this._lineas[1]).AsignarNota(this._cancion.GetTipoDeNotas()[2].GetNombre());
						(this._lineas[2]).AsignarNota(this._cancion.GetTipoDeNotas()[3].GetNombre());
						(this._lineas[3]).AsignarNota(this._cancion.GetTipoDeNotas()[4].GetNombre());
                        break;
                    case 6:
						(this._lineas[0]).AsignarNota(this._cancion.GetTipoDeNotas()[0].GetNombre());
						(this._lineas[0]).AsignarNota(this._cancion.GetTipoDeNotas()[1].GetNombre());
						(this._lineas[1]).AsignarNota(this._cancion.GetTipoDeNotas()[2].GetNombre());
						(this._lineas[1]).AsignarNota(this._cancion.GetTipoDeNotas()[3].GetNombre());
						(this._lineas[2]).AsignarNota(this._cancion.GetTipoDeNotas()[4].GetNombre());
						(this._lineas[3]).AsignarNota(this._cancion.GetTipoDeNotas()[5].GetNombre());
                        break;
                    case 7:
						(this._lineas[0]).AsignarNota(this._cancion.GetTipoDeNotas()[0].GetNombre());
						(this._lineas[0]).AsignarNota(this._cancion.GetTipoDeNotas()[1].GetNombre());
						(this._lineas[1]).AsignarNota(this._cancion.GetTipoDeNotas()[2].GetNombre());
						(this._lineas[1]).AsignarNota(this._cancion.GetTipoDeNotas()[3].GetNombre());
						(this._lineas[2]).AsignarNota(this._cancion.GetTipoDeNotas()[4].GetNombre());
						(this._lineas[2]).AsignarNota(this._cancion.GetTipoDeNotas()[5].GetNombre());
						(this._lineas[3]).AsignarNota(this._cancion.GetTipoDeNotas()[6].GetNombre());
                        break;
                    case 8:
						(this._lineas[0]).AsignarNota(this._cancion.GetTipoDeNotas()[0].GetNombre());
						(this._lineas[0]).AsignarNota(this._cancion.GetTipoDeNotas()[1].GetNombre());
						(this._lineas[1]).AsignarNota(this._cancion.GetTipoDeNotas()[2].GetNombre());
						(this._lineas[1]).AsignarNota(this._cancion.GetTipoDeNotas()[3].GetNombre());
						(this._lineas[2]).AsignarNota(this._cancion.GetTipoDeNotas()[4].GetNombre());
						(this._lineas[2]).AsignarNota(this._cancion.GetTipoDeNotas()[5].GetNombre());
						(this._lineas[3]).AsignarNota(this._cancion.GetTipoDeNotas()[6].GetNombre());
						(this._lineas[3]).AsignarNota(this._cancion.GetTipoDeNotas()[7].GetNombre());
                        break;
                    case 9:
						(this._lineas[0]).AsignarNota(this._cancion.GetTipoDeNotas()[0].GetNombre());
						(this._lineas[0]).AsignarNota(this._cancion.GetTipoDeNotas()[1].GetNombre());
						(this._lineas[0]).AsignarNota(this._cancion.GetTipoDeNotas()[2].GetNombre());
						(this._lineas[1]).AsignarNota(this._cancion.GetTipoDeNotas()[3].GetNombre());
						(this._lineas[1]).AsignarNota(this._cancion.GetTipoDeNotas()[4].GetNombre());
						(this._lineas[2]).AsignarNota(this._cancion.GetTipoDeNotas()[5].GetNombre());
						(this._lineas[2]).AsignarNota(this._cancion.GetTipoDeNotas()[6].GetNombre());
						(this._lineas[3]).AsignarNota(this._cancion.GetTipoDeNotas()[7].GetNombre());
						(this._lineas[3]).AsignarNota(this._cancion.GetTipoDeNotas()[8].GetNombre());
                        break;
                    case 10:
						(this._lineas[0]).AsignarNota(this._cancion.GetTipoDeNotas()[0].GetNombre());
						(this._lineas[0]).AsignarNota(this._cancion.GetTipoDeNotas()[1].GetNombre());
						(this._lineas[0]).AsignarNota(this._cancion.GetTipoDeNotas()[2].GetNombre());
						(this._lineas[1]).AsignarNota(this._cancion.GetTipoDeNotas()[3].GetNombre());
						(this._lineas[1]).AsignarNota(this._cancion.GetTipoDeNotas()[4].GetNombre());
						(this._lineas[1]).AsignarNota(this._cancion.GetTipoDeNotas()[5].GetNombre());
						(this._lineas[2]).AsignarNota(this._cancion.GetTipoDeNotas()[6].GetNombre());
						(this._lineas[2]).AsignarNota(this._cancion.GetTipoDeNotas()[7].GetNombre());
						(this._lineas[3]).AsignarNota(this._cancion.GetTipoDeNotas()[8].GetNombre());
						(this._lineas[3]).AsignarNota(this._cancion.GetTipoDeNotas()[9].GetNombre());
                        break;
                    case 11:
						(this._lineas[0]).AsignarNota(this._cancion.GetTipoDeNotas()[0].GetNombre());
						(this._lineas[0]).AsignarNota(this._cancion.GetTipoDeNotas()[1].GetNombre());
						(this._lineas[0]).AsignarNota(this._cancion.GetTipoDeNotas()[2].GetNombre());
						(this._lineas[1]).AsignarNota(this._cancion.GetTipoDeNotas()[3].GetNombre());
						(this._lineas[1]).AsignarNota(this._cancion.GetTipoDeNotas()[4].GetNombre());
						(this._lineas[1]).AsignarNota(this._cancion.GetTipoDeNotas()[5].GetNombre());
						(this._lineas[2]).AsignarNota(this._cancion.GetTipoDeNotas()[6].GetNombre());
						(this._lineas[2]).AsignarNota(this._cancion.GetTipoDeNotas()[7].GetNombre());
						(this._lineas[2]).AsignarNota(this._cancion.GetTipoDeNotas()[8].GetNombre());
						(this._lineas[3]).AsignarNota(this._cancion.GetTipoDeNotas()[9].GetNombre());
						(this._lineas[3]).AsignarNota(this._cancion.GetTipoDeNotas()[10].GetNombre());
                        break;
                    case 12:
						(this._lineas[0]).AsignarNota(this._cancion.GetTipoDeNotas()[0].GetNombre());
						(this._lineas[0]).AsignarNota(this._cancion.GetTipoDeNotas()[1].GetNombre());
						(this._lineas[0]).AsignarNota(this._cancion.GetTipoDeNotas()[2].GetNombre());
						(this._lineas[1]).AsignarNota(this._cancion.GetTipoDeNotas()[3].GetNombre());
						(this._lineas[1]).AsignarNota(this._cancion.GetTipoDeNotas()[4].GetNombre());
						(this._lineas[1]).AsignarNota(this._cancion.GetTipoDeNotas()[5].GetNombre());
						(this._lineas[2]).AsignarNota(this._cancion.GetTipoDeNotas()[6].GetNombre());
						(this._lineas[2]).AsignarNota(this._cancion.GetTipoDeNotas()[7].GetNombre());
						(this._lineas[2]).AsignarNota(this._cancion.GetTipoDeNotas()[8].GetNombre());
						(this._lineas[3]).AsignarNota(this._cancion.GetTipoDeNotas()[9].GetNombre());
						(this._lineas[3]).AsignarNota(this._cancion.GetTipoDeNotas()[10].GetNombre());
                        (this._lineas[3]).AsignarNota(this._cancion.GetTipoDeNotas()[11].GetNombre());
                        break;
                }
			
            }
    }
}


